package com.aabte.gc;

/**
 * -XX:NewSize=10485760
 * -XX:MaxNewSize=10485760
 * -XX:InitialHeapSize=20971520
 * -XX:MaxHeapSize=20971520
 * -XX:SurvivorRatio=8
 * -XX:MaxTenuringThreshold=15
 * -XX:PretenureSizeThreshold=10485760
 * -XX:+UseParNewGC
 * -XX:+UseConcMarkSweepGC
 * -XX:+PrintGCDetails
 * -XX:+PrintGCTimeStamps
 * -Xloggc:gc.log
 *
 * @author Daniel
 */
public class YoungGcToOld {

    public static void main(String[] args) {

        /*
            -XX:NewSize=10485760
            -XX:MaxNewSize=10485760
            -XX:InitialHeapSize=20971520
            -XX:MaxHeapSize=20971520
            -XX:SurvivorRatio=8
            -XX:MaxTenuringThreshold=15
            -XX:PretenureSizeThreshold=10485760
            -XX:+UseParNewGC
            -XX:+UseConcMarkSweepGC
            -XX:+PrintGCDetails
            -XX:+PrintGCTimeStamps
            -Xloggc:gc.log
         */

        /*
            总堆20M
            新生代10M，Eden区8M，Survivor区1M
            实际新生代容量：9216K
         */

        byte[] array1 = new byte[2 * 1024 * 1024];
        array1 = new byte[2 * 1024 * 1024];
        // 不能再分配2M了，因为实际容量稍小些
        array1 = new byte[1 * 1024 * 1024];
        array1 = null;

        byte[] array2 = new byte[128 * 1024];
        // 此时Eden区有6M垃圾对象 + 128K存活对象

        // 无法再分配2M内存空间了，执行下面操作需要先进行Young GC
        byte[] array3 = new byte[2 * 1024 * 1024];

        // Young GC后，Eden区有2M，Survivor2区128K

        array3 = new byte[2 * 1024 * 1024];
        array3 = new byte[2 * 1024 * 1024];
        array3 = new byte[128 * 1024];
        array3 = null;

        // 此时Eden区有7M+128K的非存活对象，Survivor2区128K

        // 触发Young GC，Eden区和Survivor清空
        // array1年龄2 + 未知对象512K，导致大于Survivor区的50%直接进入老年代
        byte[] array4 = new byte[2 * 1024 * 1024];

    }

}
